package cn.com.open.itembank.service;

import cn.com.open.itembank.dto.CopyCourseModel;
import cn.com.open.itembank.dto.ItemBank;
import cn.com.open.itembank.dto.ReturnModel;
import cn.com.open.itembank.entity.CourseItemBank;

/**
 * Created by lucky on 2017/7/13.
 */
public interface ItemBankService {
    /**
     * 根据题库id获取题库信息.
     *
     * @param itemBankId 题库id
     * @return 可用题库信息
     */
    CourseItemBank getCourseItemBankInfo(String itemBankId);

    /**
     * 根据资源课程id获取题库信息.
     *
     * @param courseId 资源课程id
     * @return 可用题库信息
     */
    CourseItemBank getCourseItemBankInfoByCourseId(String courseId);

    /**
     * 根据题库id获取题库信息.
     *
     * @param itemBankId 题库id
     * @return 题库信息
     */
    CourseItemBank getNotDeletedById(String itemBankId);

    /**
     * 判断该课程题库，是否来源于内部.
     *
     * @param itemBankId 题库id
     * @return true ，内部课程题库；false，外部课程题库
     */
    boolean isInnerCourse(String itemBankId);

    /**
     * 新增课程题库.
     *
     * @param model    课程题库信息
     * @param isNative 来源：True，内部；False，外部
     * @return the int
     */
    ReturnModel insert(ItemBank model, boolean isNative);

    /**
     * 复制课程题库.
     *
     * @param sourceCourseId 源资源课程ID（被共享的课程）
     * @param courseModel    复制课程模型
     * @return the return model
     */
    ReturnModel copy(String sourceCourseId, CopyCourseModel courseModel);

    /**
     * Delete int.
     *
     * @param itemBankId the item bank id
     * @param appKey     the app id
     * @return the int
     */
    int delete(String itemBankId, String appKey);

    /**
     * 修改课程题库.
     *
     * @param id         题库id
     * @param name       题库课程模型名称
     * @return the int
     */
    int update(String id, String name);

    /**
     * 更新题库状态.
     *
     * @param id 题库ID
     * @return the int
     */
    int changeStatus(String id);

    /**
     * 判断给定appkey是否包含在配置文件的applist许可列表内，如果包含则说明拥有删除题库权的权利.
     *
     * @param appKey appKey
     * @return true，拥有；false，不拥有
     */
    boolean hasSuperPermission(String appKey);

    /**
     * 判断给定的appkey是否拥有给定的题库id的管理权限，如果是题库所有者或者拥有超级权限均视为拥有权限.
     *
     * @param itemBankId 题库id
     * @param appKey     appkey
     * @return true，拥有；false，不拥有
     */
    boolean hasPermission(String itemBankId, String appKey);

    /**
     * 判断给定的appkey是否拥有给定的资源课程id的管理权限
     *
     * @param courseID 资源id
     * @param appKey     appkey
     * @return true，拥有；false，不拥有
     */
    boolean coursePermission(String courseID, String appKey);

    /**
     * Redis 查询题数集合
     * @return
     */
    ReturnModel findCourseQuestionCount();

    /**
     * Redis 题数集合添加到redis
     */
    void addCourseQuestionCount();
}
